﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Fiuba.Algo3.Titiritero.Vista;
using Fiuba.Algo3.Titiritero;
using LibreriaDeClases;
using System.Xml;
namespace BattleCity
{
    public abstract class Arma : ObjetoPasivo
    {
        protected int municiones;

        private int contador = 0;
        public override void Vivir()
        {
            if (contador == 70)
            {
                Escenario.getEscenario().Objetos.Remove(this);
                contador = 0;
            }
            contador++;
        }

        protected abstract bool debeDisparar();
        protected abstract Proyectil getProyectil(Point ubicacion, IDireccion direccion);

        //Dispara de forma aleatoria
        public void DispararAutomatica(Point ubicacion, IDireccion direccion)
        {
            if (this.debeDisparar())
            {
                Point p = new Point(ubicacion.X, ubicacion.Y);

                if (direccion.EsArriba())
                {
                    p.Y = p.Y - 35;
                    p.X = p.X - 5;
                }
                else if (direccion.EsDerecha())
                {
                    p.X = p.X + 25;
                    p.Y = p.Y - 5;
                }
                else if (direccion.EsAbajo())
                {
                    p.Y = p.Y + 25;
                    p.X = p.X - 5;
                }
                else if (direccion.EsIzquierda())
                {
                    p.X = p.X - 35;
                    p.Y = p.Y - 5;
                }
                Proyectil proyectil = getProyectil(p, direccion);
                if (proyectil != null)
                    Escenario.getEscenario().Objetos.Add(proyectil);
            }
        }
        int ultimoDisparo = 0;
        //Dispara cada 400ms
        public void DispararManual(Point ubicacion, IDireccion direccion)
        {
            int tiempoActual = DateTime.Now.Millisecond;
            if ((tiempoActual > (400 + ultimoDisparo)) || (tiempoActual < (ultimoDisparo - 400)) || (tiempoActual < (400 - ultimoDisparo)))
            {
                Point p = new Point(ubicacion.X, ubicacion.Y);

                if (direccion.EsArriba())
                {
                    p.Y = p.Y - 35;
                    p.X = p.X - 5;
                }
                else if (direccion.EsDerecha())
                {
                    p.X = p.X + 25;
                    p.Y = p.Y - 5;
                }
                else if (direccion.EsAbajo())
                {
                    p.Y = p.Y + 25;
                    p.X = p.X - 5;
                }
                else if (direccion.EsIzquierda())
                {
                    p.X = p.X - 35;
                    p.Y = p.Y - 5;
                }
                Proyectil proyectil = getProyectil(p, direccion);
                if (proyectil != null)
                    Escenario.getEscenario().Objetos.Add(proyectil);
                ultimoDisparo = tiempoActual;
            }
        }

        //Cuando el portador del arma es destruido, utiliza este metodo que lanza el arma al escenario
        public void LanzarAlEscenario(Point puntoSuperiorIzquierdo)
        {
            this.Figura = new Rectangulo(puntoSuperiorIzquierdo, 15, 15);
            Escenario.getEscenario().Objetos.Add(this);
        }

        override public bool ImpactaCon(Objeto objeto)
        {
            return objeto.ImpactaCon(this);
        }
        override public bool ImpactaCon(Tanque tanque)
        {
            return tanque.ImpactaCon(this);
        }
        override public bool ImpactaCon(Base baseob) { return true; }

        virtual public void CargarMuniciones(Arma arma) { }

	    public override void Persistir(XmlDocument xml, XmlNode subnodo)
        {

            XmlNode principal = xml.CreateElement(this.nombre);
            XmlNode posicion = xml.CreateElement("Posicion");
            XmlNode x = xml.CreateElement("X");
            XmlNode y = xml.CreateElement("Y");

            x.InnerText = X.ToString();
            y.InnerText = Y.ToString();

            posicion.AppendChild(x);
            posicion.AppendChild(y);

            principal.AppendChild(posicion);

            subnodo.AppendChild(principal);
        }
        public int getCantidadDeMuniciones()
    {
        return this.municiones;
    }
    }
}
